==============
Version 5.4.57
==============

Library:

* :doc:`Record locking </admin/record_locking>` bug, when PostgreSQL, MSSQL or
  Firebird database is used, fixed
  

To use record locking for items for which you defined
:doc:`on_apply </refs/server/item/on_apply>` 
event handler you must change.
Add the connection parameter, create a cursor and use the cursor to execute 
sql queries. Otherwise the record locking won't work.

For example, the code

.. code-block:: py

  def on_apply(item, delta, params): 
      tracks_sql = []
      delta.update_deleted()    
      for d in delta:
          for t in d.invoice_table:
              if t.rec_inserted():
                  sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) + \
                  %s WHERE ID = %s" % \
                  (t.quantity.value, t.track.value)                
              elif t.rec_deleted():
                  sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                  (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) WHERE ID = %s" % \
                  (t.id.value, t.track.value)
              elif t.rec_modified():
                  sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                  (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) + %s WHERE ID = %s" % \
                  (t.id.value, t.quantity.value, t.track.value)
              tracks_sql.append(sql)                
      sql = delta.apply_sql()
      return item.task.execute(tracks_sql + [sql])

must be changed to 

.. code-block:: py

  def on_apply(item, delta, params, connection): 
      with item.task.lock('invoice_saved'):
          cursor = connection.cursor()         
          delta.update_deleted()    
          for d in delta:
              for t in d.invoice_table:
                  if t.rec_inserted():
                      sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) + \
                      %s WHERE ID = %s" % \
                      (t.quantity.value, t.track.value)                
                  elif t.rec_deleted():
                      sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                      (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) WHERE ID = %s" % \
                      (t.id.value, t.track.value)
                  elif t.rec_modified():
                      sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                      (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) + %s WHERE ID = %s" % \
                      (t.id.value, t.quantity.value, t.track.value)
                  cursor.execute(sql)

